#ifndef __CMDPARSER__
#define __CMDPARSER__
#include "../_public.h"

/* 该头文件用于实现对各种命令的解析  */

// 信息类型
typedef enum message_type_s
{
    COMMAND,
    LOGIN_USER,
    LOGIN_PWD
} msgType_t;

// 命令类型
typedef enum {
    CD, 
    LS, 
    PWD, 
    PUTS, 
    GETS, 
    REMOVE, 
    N_CMD,              // 支持命令总数 
    INVALID_CMD,        // 无效命令 
} CMD_TYPE;

// 文件类型
typedef enum {
    NORMAL_FILE,        // 普通文件
    DIRECTORY,          // 目录、文件夹
    N_FILE_TYPE,        // 支持的文件类型数量 
    UNKNOWN,            // 未知类型 
} FILE_TYPE;

// ls命令的查找结果的文件、目录信息节点
typedef struct file_node_s
{
    FILE_TYPE file_type;        // 文件类型
    char *file_name;            // 文件名
    size_t size;                // 文件大小，字节为单位
    struct file_node_s *next;   // next指针
} fileinfo_node_t;

// ls命令的查找结果的文件、目录信息
typedef struct fileinfo_s
{
    fileinfo_node_t *head;       // 文件目录信息节点
    int size;                       // 文件/目录个数
} fileinfos_t;

// 服务器->客户端响应数据格式
typedef struct serv2client_message_s
{
    msgType_t  messagetype;         // 信息类型，现在不确定是否使用，预留后续使用
    bool exec_status;               // 命令执行状态，true: 成功 false: 失败
    char *description;              // 信息具体描述
    fileinfos_t *filedirs;          // ls返回的文件、目录信息
    char *cwd;                      // 客户端当前路径
} serv2clientMsg_t;

/*
*description:
*       判断是否为支持的命令类型，若是返回true,否则返回false
*usage:
*       xxx
*paras:
*       cmd         命令名称, 如：cd, ls, pwd
*       type        枚举命令类型值指针，用于接收命令类型枚举值
*returns:
*       true        支持的有效命令
*       false       不支持的无效命令
*/
bool isValidCMD(const char *cmd, CMD_TYPE *type); // 爽

// cd命令处理
serv2clientMsg_t cdFunc(char **tokens); // 旭

// ls命令处理
/*
*description:
*       列出absPath路径下的所有文件、子目录信息并封装返回
*usage:
*       xxx
*paras:
*       absPath     由服务器维护的真实存在的物理路径，如：/home/works/zs/src
*                   其中zs为登录的用户名
*returns:
*       serv2clientMsg_t类型的返回值信息
*/
serv2clientMsg_t lsFunc(const char *absPath); // 爽

// puts命令处理,上传文件
serv2clientMsg_t putsFunc(char **tokens); // 旭

// gets命令处理,下载文件
serv2clientMsg_t getsFunc(char **tokens); // 飞

// remove命令处理
serv2clientMsg_t removeFunc(char **tokens); // 飞

// pwd命令处理
serv2clientMsg_t pwdFunc(char **tokens); // 勇

// mkdir命令处理
serv2clientMsg_t mkdirFunc(char **tokens,char* path,int size); // 旭

// 无效命令响应
serv2clientMsg_t invalidFunc(char **tokens); // 飞

/*
 * 单元测试函数声明，测试完成后需要删除
 * 创建人：曾爽
 * 创建事件：2024/07/06
 * */

void unitest_lsFunc(void);

#endif

